package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.Item;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired
    private ItemCatMapper itemCatMapper;
//获取三级目录
//    @Override
//    public List<ItemCat> findItemCatList(Integer type) {
//        QueryWrapper<ItemCat> queryWrapper =new QueryWrapper<>();
//        queryWrapper.eq("parent_id", 0);
//       List<ItemCat> List1 = itemCatMapper.selectList(queryWrapper);
//       if (List1==null) return null;
//        for (ItemCat ItemCat1 : List1) {
//            QueryWrapper<ItemCat> queryWrapper1 = new QueryWrapper<>();
//            queryWrapper1.eq("parent_id",ItemCat1.getId());
//            List<ItemCat> List2 = itemCatMapper.selectList(queryWrapper1);
//            if (List2==null) return null;
//            ItemCat1.setChildren(List2);
//            for (ItemCat ItemCat2 : List2) {
//                QueryWrapper<ItemCat> queryWrapper2 = new QueryWrapper<>();
//                queryWrapper2.eq("parent_id",ItemCat2.getId());
//                List<ItemCat> List3 = itemCatMapper.selectList(queryWrapper2);
//                ItemCat2.setChildren(List3);
//            }
//        }
//
//    return List1;
//    }
    public Map<Integer,List<ItemCat>> getMap(){
        Map<Integer,List<ItemCat>> map = new HashMap<>();
        List<ItemCat> list=itemCatMapper.selectList(null);
        for (ItemCat itemCat : list) {
/**
 *  规则：map里的key不能重复，判断map中是否有key，
 *  没有key该子级是第一个父级元素的孩子，应该声明父级，将自己作为第一个自己保存
 *  有key 找到父级的子级序列，将子级追加到序列中即可。
 */
        if(map.containsKey(itemCat.getParentId())){
          map.get(itemCat.getParentId()).add(itemCat);
//            获取所有父级的已知子级

             }else {
            List<ItemCat> list1 =new ArrayList<>();
            list1.add(itemCat);
            map.put(itemCat.getParentId(),list1 );
            }
        }
        return map;
    }

    @Override
    public List<ItemCat> findItemCatList(Integer type) {
        Map<Integer,List<ItemCat>> map=getMap();//获取数据封装后的结果
        if(type ==1){
        return map.get(0);
        }
        if(type==2){
            return getLevel2(map);
        }
            return getLevel3(map);
    }

    @Override
    @Transactional
    public void updateStatus(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void saveItemCat(ItemCat itemCat) {
        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);
    }

    @Override
    @Transactional
    public void deleteItemCat(Integer id, Integer level) {
        if(level==3){
            itemCatMapper.deleteById(id);
        }else if (level==2){//需要删除的是2级菜单，关联删除3级菜单
           QueryWrapper <ItemCat> queryWrapper = new QueryWrapper<>();
           queryWrapper.eq("parent_id", id);//条件构造器为父id=id的子级目录
            itemCatMapper.delete(queryWrapper);//删除3级
            itemCatMapper.deleteById(id);//删除2级
        }else if(level==1){
//            先删3级（获取2级），再删2级，最后删1级
//                查询2级分类信息 parent_id = 一级id
                    QueryWrapper <ItemCat>queryWrapper =new QueryWrapper();
                 queryWrapper.eq("parent_id",id);
//                 获取主键信息，第一列信息
                List list2 = itemCatMapper.selectObjs(queryWrapper);
                 //删除3级
            for (Object id2 : list2) {
                QueryWrapper<ItemCat> queryWrapper1 = new QueryWrapper<>();
                queryWrapper1.eq("parent_id", id2);
                itemCatMapper.delete(queryWrapper1);//3
                //删除2级
                Integer intId2=(Integer)id2;
                itemCatMapper.deleteById(intId2);//2
            }
            itemCatMapper.deleteById(id);


        }

    }

    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat) {

        itemCatMapper.updateById(itemCat);
    }

    private List<ItemCat> getLevel3(Map<Integer, List<ItemCat>> map) {
        List<ItemCat> list = getLevel2(map);
        for (ItemCat itemCat1: list){
            List<ItemCat> list2= itemCat1.getChildren();
//            根据2级查3级
            if(list2==null) continue;
            for(ItemCat itemCat2:list2){
                List<ItemCat> list3=map.get(itemCat2.getId());
                itemCat2.setChildren(list3);
            }
//            将3级已经封装完成  将2级封装到1级中
            itemCat1.setChildren(list2);
        }
        return list;
    }

    private List<ItemCat> getLevel2(Map<Integer,List<ItemCat>> map){
        List<ItemCat> list1 = map.get(0);
        for(ItemCat itemCat :list1){
            List<ItemCat> list2 = map.get(itemCat.getId());
            itemCat.setChildren(list2);
    }
      return list1;
        }

    /**
     * 实现三级商品分类查询(三层结构嵌套)
     * url：/itemCat/findItemCatList/3
     * 请求参数：type= level 请求级别
     * 返回值： SysResult对象
     */

}
